<!DOCTYPE html>
<html lang="en"><head>
    <title>CZH-DEV BLOG</title>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="format-detection" content="telephone=no" />
    <meta name="theme-color" content="#000084" />
    <link rel="icon" href="https://czh-dev.gitee.io/czh-blog.gitee.io//favicon.ico">
    <link rel="canonical" href="https://czh-dev.gitee.io/czh-blog.gitee.io/">
    
    
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="navbar-inner">
        <div class="container">
            <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"></button>
            <a class="brand" href="https://czh-dev.gitee.io/czh-blog.gitee.io/">CZH-DEV BLOG</a>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/about/">
                                    
                                    <span>About</span>
                                </a>
                            </li>
                        
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/post/">
                                    
                                    <span>All posts</span>
                                </a>
                            </li>
                        
                    
                        
                            <li>
                                <a href="/czh-blog.gitee.io/ebook/">
                                    
                                    <span>Resource</span>
                                </a>
                            </li>
                        
                    
                </ul>
            </div>
        </div>
    </div>
</nav><div id="content" class="container">
<div style="display: flex;">
  <div class="row-fluid navmargin">
    <div class="page-header">
      <h1>常见面试题（二） - Sat, Feb 11, 2023</h1>
    </div>
    <p class="lead"></p>
    <ul>
<li><input disabled="" type="checkbox"> <strong>Redis常见数据类型:</strong></li>
</ul>
<p>​		string类型 (存放一下结构体信息例如用户信息、计数、共享session)</p>
<p>​		hash类型 （存储、读取、修改用户属性。也可以用<a href="https://so.csdn.net/so/search?q=Hash&amp;spm=1001.2101.3001.7020">Hash</a>做表数据缓存）</p>
<p>​		list类型 （最新消息排行、消息队列）</p>
<p>​		set类型 （共同好友；利用唯一性，统计访问网站的所有独立ip）</p>
<p>​		zset类型（排序）</p>
<ul>
<li>
<p><input disabled="" type="checkbox"> <strong>int占4个字节</strong></p>
<p><img src="https://czh-pic.oss-cn-guangzhou.aliyuncs.com/202302112243859.png" alt="image-20221102154000640"></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>字节和比特：1：8</strong></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>String想要拼接字符串的方法有</strong>：</p>
<ul>
<li><code>+</code>拼接（底层是StringBuilder）</li>
<li>使用<code>StringBuilder</code></li>
<li>使用<code>StringBuffer</code>(底层就是在StringBuilder基础上加了synchronized关键字)</li>
<li>StringJoiner.add()（底层是StringBuilder）</li>
<li>StringUtils.join()（底层是StringBuilder）</li>
<li>concat()：（底层是new了一个新的字符串）</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>String截取字符串</code>：<code>substring</code>，第一个参数是第一个索引，第二参数是最后一个索引(左闭右开 s.substring(a,b) =&gt; [a,b) )</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Linux常见命令:</strong></p>
<ul>
<li>
<p>新建目录 mkdir</p>
</li>
<li>
<p>拷贝 cp</p>
</li>
<li>
<p>移动|重命名 mv</p>
</li>
<li>
<p>压缩|解压缩 zip unzip gzip tar</p>
<p>​					tar -zcvf 压缩包名.tar.gz  源文件
​					tar -zxvf 要解压的压缩包名.tar.gz -C 指定目录</p>
</li>
<li>
<p>在线安装 yum</p>
</li>
<li>
<p>查看文件 cat more</p>
</li>
<li>
<p>服务器之间文件拷贝：scp</p>
</li>
<li>
<p>精准查找 grep</p>
</li>
<li>
<p>文件编辑 vi</p>
</li>
<li>
<p>查看CPU top</p>
</li>
<li>
<p>查看内存 free</p>
</li>
<li>
<p>查看端口使用 netstart</p>
</li>
<li>
<p>切换用户 su</p>
</li>
<li>
<p>管理员权限 sudo</p>
</li>
<li>
<p>新增组 groupadd</p>
</li>
<li>
<p>查看磁盘容量：df （@@）</p>
</li>
<li>
<p>设置权限：chmod + xrw （@）</p>
</li>
<li>
<p>日志文件中某个关键字有多少行:  less (@)</p>
</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>String常用方法</code>：substring、split、equals、replace、trim（删除开头结尾的空格）、length、charAt、indexOf、startWith、endWith（判断开头、结尾的字符是不是传进去的字符）</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>Collection和Collections的区别</code>：Collection是util包下的一个集合类接口，Collections是一个包装类（工具类）</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>迭代器的hasNext的方法干什么用的</code>：检测集合中是否还有元素</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>Ajax的基本参数：</code>url data callback回调函数  type timeout cache dataType async success error</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>SpringMVC的工作原理</code>：@@</p>
<ol>
<li>客户端发起请求（http）通过web.xml找到 DispatchServlet（前端控制器）；</li>
<li>由DispatchServlet控制器通过配置文件（servletName-servlet.xml）寻找到一个或多个HandlerMapping（映射处理器），找到用于处理请求的controller（后端控制器）；</li>
<li>DispatchServlet将请求提交到controller；</li>
<li>Controller处理业务逻辑后，</li>
<li>controller返回数据 ModelAndVIew给DispatchServlet；</li>
<li>DispatchServlet寻找到一个或多个ViewResolver（视图解析器），找到ModelAndVIew指定的视图；</li>
<li>DispatchServle负责将结果返给View（客户端JSP页面），封装Http；</li>
<li>view响应页面的HTTP请求，返回响应数据，浏览器绘制页面。</li>
</ol>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>SpringBoot配置文件一般用哪种</code>：yaml</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>pom文件中会引入jdbc-start，mysql-start，你有了解过底层结构吗</strong></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>MySQL优化:</strong></p>
<ul>
<li>建立索引</li>
<li>不查无关的数据</li>
<li>分表</li>
<li>主从优化</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>MySQL里面除了innerDB还用过哪些</code>：MyISAM</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>MyISAM的特点</code>：非事务表，没有事务</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>List和数组的互相转化怎么来</code>：遍历 | <code>内置方法asList</code></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>有了解过JDK里的方法吗</strong></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>MQ有哪几部分组成：</code>NameServer、Broker、Producer以及Consumer四部分。</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Linux：</strong></p>
<ul>
<li><code>查看某个项目的的进程：ps -ef</code></li>
<li><code>某个项目的实时日志：tail -f -n</code></li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>HashMap底层数据结构：</code>数组、链表、红黑树</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>JDK1.8和之前的版本最大的变化是什么：</code>加了lambda表达式、方法引用、stream流</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>char和varchar的区别：</code>char定长，varchar是可变长度的</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>MySQL索引的优缺点：</strong></p>
<ul>
<li>
<p>优点：</p>
<p>提高查询速度，减小了服务器需要扫描的数据量</p>
</li>
<li>
<p>缺点：</p>
<p>降低更新表的速度；占用磁盘空间</p>
</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>SpringMVC的代理：</code>JDK、cglib</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>ES提高查询速度要用什么索引：</strong></p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Lock 和 Synchronized的区别：</strong></p>
<ul>
<li><code>Lock是接口，Synchronized是关键字，是内置的语言实现</code></li>
<li><code>发生异常的时候，Synchronized会自动释放锁，Lock不会主动释放占有锁，可能会造成死锁的发生（需要手动unLock），所以使用时最好用try...catch包起来，在finally里写上unLock，避免死锁发生</code></li>
<li>Lock等待锁过程中，可以用interrupt来终止等待，而synchronized只能等待锁释放，不能响应中断</li>
<li>Lock可以使用tryLock来知道有没有获取锁，而synchronized不能</li>
<li>Lock可以提高多个线程进行读操作的效率（可以通过readwritelock实现读写分离）</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>where条件执行顺序：</code>() &gt; 算数运算符（+ - * /） &gt; 所有的关系运算符 &gt; NOT &gt; AND &gt; OR</p>
<ul>
<li>当优先级相同的情况下，都是用and，<code>左右顺序会有什么影响</code>：会影响大批量查询速度</li>
</ul>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>在网关怎么实现接口限流：</code>使用Sentinel限流</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>RocketMQ有什么优势：</code>异步刷盘（效率高）同步刷盘（可靠性高），支持事务消息，支持消息重试，死信队列防止死循环发消息，拥有世界上最好的实践——双十一</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>接口防刷怎么实现：</code>使用Sentinel | 使用Redis记录访问次数，每次-1</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>签名认证：</code>打乱参数顺序再拼接，再MD5加密，然后和服务器加密后的参数对比，相同的放行，不相同的拦截</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>私钥可以解开公钥吗：</code>可以相互解</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>OSS传的是什么参数：</code>url，地域节点，key</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>讲一下nacos服务治理：</code>Spring Cloud Alibaba笔记3.1</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>es倒排索引的理解：</code>通过key寻找value</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>Redis持久化方式有哪两种：</code>RDB和AOF(<code>AOF会记录过程，RDB只管结果</code>)</p>
<blockquote>
<p><code>RDB</code>（Redis DataBase），是redis默认的存储方式，RDB方式是通过快照（ snapshotting ）完成的。它保存的是某一时刻的数据并不关注过程。<code>RDB保存redis某一时刻的数据的快照</code></p>
<p><code>AOF</code>（append only file）是Redis的另一种持久化方式。<code>Redis默认情况下是不开启的</code>。开启AOF持久化后Redis 将所有对数据库进行过<code>写入的命令（及其参数）（RESP）记录到 AOF 文件</code>， 以此达到记录数据库状态的目的，这样当Redis重启后只要按顺序回放这些命令就会恢复到原始状态了。</p>
</blockquote>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>IO和NIO的区别：</strong></p>
<table>
<thead>
<tr>
<th>IO</th>
<th>NIO</th>
</tr>
</thead>
<tbody>
<tr>
<td>面向流</td>
<td>面向缓冲</td>
</tr>
<tr>
<td>阻塞IO</td>
<td>非阻塞IO</td>
</tr>
<tr>
<td>无</td>
<td>选择器</td>
</tr>
</tbody>
</table>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>堆和栈，什么在堆什么在栈：</strong></p>
<blockquote>
<p><strong>栈：</strong></p>
<p><strong>函数中定义的基本类型变量，对象的引用变量都在函数的栈内存中分配。</strong>
栈内存特点，数据一执行完毕，变量会立即释放，节约内存空间。
栈内存中的数据，没有默认初始化值，需要手动设置。</p>
<p><strong>堆：</strong></p>
<p><strong>堆内存用来存放new创建的对象和数组。</strong>
堆内存中所有的实体都有内存地址值。
堆内存中的实体是用来封装数据的，这些数据都有默认初始化值。
堆内存中的实体不再被指向时，JVM启动垃圾回收机制，自动清除，这也是JAVA优于C++的表现之一（C++中需要程序员手动清除）</p>
</blockquote>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>Runable与Callable的区别：</code>Runnable没有返回值；Callable可以返回执行结果，是个泛型，和Future、FutureTask配合可以用来获取异步执行的结果 Callable接口的call ()方法允许抛出异常；Runnable的run ()方法异常只能在内部消化，不能往上继续抛</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>事务的隔离级别：</code>读未提交、读已提交、可重复读、可串行化</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>Cookie和Session的的区别：</strong></p>
<p>1，session 在服务器端，cookie 在客户端（浏览器）</p>
<p>2，session 默认被存在在服务器的一个文件里（不是内存）</p>
<p>3，session 的运行依赖 session id，而 session id 是存在 cookie 中的，也就是说，如果浏览器禁用了 cookie ，同时 session 也 会失效（但是可以通过其它方式实现，比如在 url 中传递 session_id）</p>
<p>4，session 可以放在 文件、数据库、或内存中都可以。</p>
<p>5，用户验证这种场合一般会用 session</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <strong>JDBC访问数据库的基本步骤是什么？</strong></p>
<p>1，加载驱动</p>
<p>2，通过DriverManager对象获取连接对象Connection</p>
<p>3，通过连接对象获取会话</p>
<p>4，通过会话进行数据的增删改查，封装对象</p>
<p>5，关闭资源</p>
</li>
<li>
<p><input disabled="" type="checkbox"> <code>用过的测试工具:</code>postman jmeter压力测试 jcstress并发压力测试</p>
</li>
</ul>

    <h4><a href="https://czh-dev.gitee.io/czh-blog.gitee.io/">Back to Home</a></h4>
  </div>

  <div class="span3 bs-docs-sidebar" style="position:fixed;right: 40px;top: 50px;">
    <h1>catalogue</h1>
    <ul class="nav nav-list bs-docs-sidenav">
      <div class="toc-div">
        <nav id="TableOfContents"></nav>
      </div>
    </ul>
  </div>

</div>
<script src="https://cdn.jsdelivr.net/npm/gumshoejs@5.1.2/dist/gumshoe.min.js"></script>
<script>
  var spy = new Gumshoe('#TableOfContents a', {
    nested: true,
    nestedClass: 'active'
  });
</script>
<style>
   
  #TableOfContents li,
  #TableOfContents ul {
    list-style-type: none;
  }

  #TableOfContents ul {
    padding-left: 0px;
  }

  #TableOfContents li>a {
    display: block;
    padding: 4px 20px;
    font-size: 95%;
    color: #000000;
  }

  #TableOfContents li>a:hover,
  #TableOfContents li>a:focus {
    padding-left: 19px;
    color: #3A6bA5;
    text-decoration: none;
    background-color: transparent;
    border-left: 1px solid #3A6bA5;
  }

  #TableOfContents li.active>a,
  #TableOfContents li.active>a:hover,
  #TableOfContents li.active>a:focus {
    padding-left: 18px;
    font-weight: bold;
    color: #3A6bA5;
    background-color: transparent;
    border-left: 2px solid #3A6bA5;
  }

   
  #TableOfContents li>ul {
    padding-bottom: 10px;
  }

  #TableOfContents li li>a {
    padding-top: 1px;
    padding-bottom: 1px;
    padding-left: 30px;
    font-size: 14px;
    font-weight: normal;
  }

  #TableOfContents li li>a:hover,
  #TableOfContents li li>a:focus {
    padding-left: 29px;
  }

  #TableOfContents li li.active>a,
  #TableOfContents li li.active>a:hover,
  #TableOfContents li li.active>a:focus {
    padding-left: 28px;
    font-weight: 500;
  }

  #TableOfContents .nav-link.active+ul {
    display: block;
  }

  #TableOfContents li>ul {
    display: none;
  }

  #TableOfContents li.active>ul {
    display: inherit;
  }

  .toc-div {
    position: -webkit-sticky;
     
    position: sticky;
     
    top: 20px;
  }
</style>


        </div><footer class="container">
    <hr class="soften">
    <p>
    <a href="https://space.bilibili.com/1799809923">Love eating fried pork ribs</a> | 

&copy; 
<a href="http://jmf-portfolio.netlify.com" target="_blank">
    JM Fergeau
</a>
<span id="thisyear">2023</span>

    | My site


        | Built on <a href="//gohugo.io" target="_blank">Hugo</a>

</p>
    <p class="text-center">
        <a href="https://facebook.com">Facebook</a> 
        <a href="https://twitter.com">Twitter</a> 
        <a href="https://linkedin.com">Linkedin</a> 
        <a href="https://github.com">GitHub</a> 
        <a href="https://gitlab.com">GitLab</a>
    </p>
</footer>

</body><link rel="stylesheet" href="/czh-blog.gitee.io/css/bootstrap.css">
<link rel="stylesheet" href="/czh-blog.gitee.io/css/bootstrap-responsive.css">
<link rel="stylesheet" href="/czh-blog.gitee.io/css/style.css">

<script src="/czh-blog.gitee.io/js/jquery.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-386.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-transition.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-alert.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-modal.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-dropdown.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-scrollspy.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-tab.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-tooltip.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-popover.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-button.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-collapse.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-carousel.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-typeahead.js"></script>
<script src="/czh-blog.gitee.io/js/bootstrap-affix.js"></script>
<script>
    _386 = { 
        fastLoad: false ,
        onePass: false , 
        speedFactor: 1 
    };

    
    function ThisYear() {
        document.getElementById('thisyear').innerHTML = new Date().getFullYear();
    };
</script>
</html>
